package yeliuhuishi.WordCount.basics;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;


//生命周期：框架每传递进来一个kv 组，reduce方法被调用一次
//Reducer---负责处理reduce阶段的功能

/**
 * Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
 * reduce方法要接收的输入参数是一个key一个迭代器<T>values
 * KEYIN:是框架传输给reduce方法的输入参数的key的数据类型---->对应map方法的输出key的类型
 * VALUEIN:是框架传输给reduce方法的输入参数的value的数据类型---->对应map方法的输出value的类型
 * <p>
 * KEYOUT:reduce方法处理完数据后输出的key的类型
 * VALUEOUT:reduce方法处理完数据后输出的value的类型
 */
//为了在main中直接使用内部类,必须将他变成静态的
public class myReduce extends Reducer<Text, IntWritable, Text, LongWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        /*
         * 迭代器的使用--经过shuffle阶段的处理,我们的键值对已经是有序的
         * 1907  1  beijign    1     hello  1     hello  1      qianfeng 1
         * 我们默认将相同key的key-value分成一组,迭代器中就是这一组中的所有的value的值的集合
         */
        //定义一个变量,用于存储单词出现的次数
        int count = 0;
        for (IntWritable value : values) {
            count += value.get();
        }
        //将结果传出reduce
        context.write(key, new LongWritable(count));
    }
}